package org.jeecg.modules.common.baseentity;

import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

@Data
public class Row2ColModel {
    // clazzT 类型
    // groupFields 固定分组属性名称
    // groupFieldsAsName 固定分组属性显示别名
    // row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
    // row2colsKeyFieldsDict 行转列动态列对应的关键属性字段字典转义
    // newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
    // newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
    // groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
    // groupCalculationFunForValueField 聚合函数作用字段，必须是newColsValueByFields中的字段不能是别的字段
    // groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
    // newValueWeightCoefficientFieldes  //聚合函数使用的权重系数字段
    // newWeightCoefficientAsColName  //权重系数列名,如果有权重系数没有权重名，则会直接在求和时参与计算但并不会显示

    
    private Class clazzT;
    private String[] groupFields;
    private String[] groupFieldsAsName;

    private String[] row2colsKeyFields;
    private Map<String,String>[] row2colsKeyFieldsDict;


    private String[] newColsValueByFields;
    private String[] newColsValueUnitSymboles = null;  // valueUnits 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
    private String newColsNullValueByString = "0";

    private String[] groupCalculationFun = null ;
    private String[] groupCalculationFunForValueField = null ; //聚合函数作用字段
    private String[][] groupCalculationAsColName = null;
    private String newValueWeightCoefficientFieldes = null; /*取值数据计算求和时候的权重系数，仅仅求和和平均的时候有效，与取值属性valueFields对应*/
    private String newWeightCoefficientAsColName = null; /*权重系数对应的列名*/

    private int rowCount = 0; //行数量
    private int colCount = 0; //列数量
    private String[] resultColNmaes = null;  //最终结果列名称
    private JSONObject jsonColNmaes = null;  //最终结果列名称JSON格式

    /**
     *
     * @param clazzT 类型，其他属性后期set赋值
     */
    public Row2ColModel(Class clazzT){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        Class <T> clazz = (Class <T>) ((ParameterizedType) new Entity().getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//        this.clazzT=(Class<T>) genericType[0];

//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        this.clazzT = clazzT;
    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     */
    public Row2ColModel(Class clazzT,String[] groupFields,String[] groupFieldsAsName, String[] row2colsKeyFields,Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields, String[] newColsValueUnitSymboles){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles =  newColsValueUnitSymboles;
        this.groupCalculationFun = null ;
        this.groupCalculationAsColName = null;
        this.newValueWeightCoefficientFieldes = null;
        this.newWeightCoefficientAsColName = null;

    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     * @param groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
     * @param groupCalculationFunForValueField 聚合函数作用字段
     * @param groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
     */
    public Row2ColModel(Class clazzT,String[] groupFields,String[] groupFieldsAsName, String[] row2colsKeyFields,Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields,String[] newColsValueUnitSymboles, String[] groupCalculationFun,String[] groupCalculationFunForValueField, String[][] groupCalculationAsColName ){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles = newColsValueUnitSymboles;
        this.groupCalculationFun = groupCalculationFun ;
        this.groupCalculationFunForValueField = groupCalculationFunForValueField;
        this.groupCalculationAsColName =groupCalculationAsColName;
        this.newValueWeightCoefficientFieldes = null;
        this.newWeightCoefficientAsColName = null;

    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     * @param groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
     * @param groupCalculationFunForValueField 聚合函数作用字段
     * @param groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
     * @param newValueWeightCoefficientFieldes 权重列名字符串，值=“WeightCoeff”，所得列名=“语文WeightCoeff”
     */
    public Row2ColModel(Class clazzT,String[] groupFields,String[] groupFieldsAsName, String[] row2colsKeyFields,Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields,String[] newColsValueUnitSymboles, String[] groupCalculationFun,String[] groupCalculationFunForValueField, String[][] groupCalculationAsColName, String newValueWeightCoefficientFieldes,String newWeightCoefficientAsColName ){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles = newColsValueUnitSymboles;
        this.groupCalculationFun = groupCalculationFun ;
        this.groupCalculationFunForValueField = groupCalculationFunForValueField;
        this.groupCalculationAsColName =groupCalculationAsColName;
        this.newValueWeightCoefficientFieldes = newValueWeightCoefficientFieldes;
        this.newWeightCoefficientAsColName = newWeightCoefficientAsColName;

    }

}
